package main

import "fmt"

/*
go的协程和python的协程--网上有些人喜欢拿web框架来做性能对比
go的gin和begoo 和python flask和django性能对比  -这个是不科学
python也有协程，不能用python线程去比对，我们就不再使用python的多线程来进行对比
只要大家懂了任何一门语言的协程，其他语言的协程都很好理解

两个方面对比go和pyhton协程
1.都开启100w协程
2.看谁更简单  -go语言的简单性 -启动一个协程
*/
//func main(){
//	for i :=0;i<1000000;i++{
//		//防止闭包添加n
//		go func(n int){
//		   for {
//		   	fmt.Println(n)
//		   	time.Sleep(time.Second)
//		   }
//		}(i)
//	}
//
//	//主死从随
//	time.Sleep(time.Second*30)
//
//
//}

//func main(){
//	course := [5]string {"da","dw","dwd","dwdw","dw"}
//	fmt.Println(course)
//	fmt.Println(course[0])
//
//	//数组的另一种创建方式
//	//首次用到省略号
//	d :=[...]int{1,2,3}
//	fmt.Println(d)
//
//	e :=[5]int{4:100}
//	fmt.Println(e)
//	//将第0个设置成1，第4个设置成1，第9个设置成100
//	f :=[...]int{0:1,4:1,9:100}
//	fmt.Println(f)
//
//	var a =[4]float32{}
//	fmt.Println("a:",a)
//
//
//	//数组操作第一场景：求长度
//	fmt.Println(len(f))
//	//数组操作的第二种场景，遍历数组
//
//	//使用for range求和
//	sum :=0
//	for i,value :=range f{
//		fmt.Println(i,value)
//		sum += value
//	}
//	fmt.Println(sum)
//	sum1 := 0
//	for i:=0; i<len(course);i++{
//		sum1 +=f[i]
//	}
//	fmt.Println(sum1)
//}

//func main(){
//	//什么是切片
//	//数组有一个很大的问题：大小确定，切片，动态数组
//	//var courses []string
//	////初始化
//	//courses = []string{"dw","dw","dw"}
//	//fmt.Println(courses)
//	//fmt.Printf("%T",courses)
//
//	//第二种初始化方法 make
//	//courses := make([]string ,5)
//	////为什么要传入长度？
//	//fmt.Println("%d",len(courses))
//	//slice对标的就是python中的list
//
//	//第三种方法：通过数组变成一个切片
//	//courses := [3]string{"1","2","3"}
//	////左闭右开的区间
//	//subCourse :=courses[1:3]  //go语言中切片是一种数据结构
//	//fmt.Printf("%T",subCourse)
//	//fmt.Println(subCourse)
//
//    //第四种方式：new
//    //subCourse1 := new([]int)
//    //fmt.Println(subCourse1)
//
//    //数组是值传递，切片不是，切片是引用传递。
//    //slice是动态数组，所以说我们需要动态添加值
//
//    //操作slice的方法
//    //append可以向切片追加元素
//
//    //想从切片里面删除元素怎么办？
//
//    deleteCourses :=[5]string{"11","22","2","#3","43"}
//    courseSlice :=deleteCourses[:] //通过取区间的值进行操作
//    courseSlice =append(courseSlice[:1],courseSlice[2:]...)//将两个slice合并，一定要加这个省略号
//    fmt.Println(courseSlice)
//
//    //如何判断某个元素是否在切片中
//    //python中有in 但是go中没有固定的用户，for循环可以解决
//    //slice进行的操作都会影响原来的数组，slice更像是一个指针，本身不存值
//
//    //slice的原理
//    //因为很多底层的知识很多时候并不难而是需要花费很多实践去慢慢理解。
//    a :=make([]int,0)
//    b :=[]int{1,2,3}
//    fmt.Println(copy(a,b))
//
//}

func main() {
	//go语言中的map ->python中的dict
	//go语言中的map的key和value类型申明的就要指明
	//1.字面值
	m1 := map[string]int{
		"m1": 1,
		"m2": 2,
	}

	fmt.Printf("%T", m1)
	//2.make函数 make函数可以创建slice 可以创建map
	m2 := make(map[string]int) //创建时里面不添加元素
	m2["m2"] = 1
	fmt.Printf("%v\n", m2)

	//3.定义一个空的map
	m3 := map[string]string{}
	fmt.Printf("%v\n", m3)

	//map中的key，不是所有类型都支持，该类型需要支持 == 或者 ！=操作
	// int rune

	//map的基本操作
	//创建一个map
	ms := map[string]int{
		"a": 1,
		"b": 2,
		"c": 3,
	}
	//1.增加
	ms["d"] = 23
    //2.查询
    v :=ms["d"]
    fmt.Println(v)
    //删除
    delete(ms,"a")
    fmt.Println("%v",ms)
    //遍历用for range
    //go 语言中也有一个list 就是数据结构中提到的链表

}

/*rpc （远程过程调用=简单的理解就是一个节点请求另一个节点提供服务）分布式开发常用
面临的问题和难点：
1.原本的本地函数放到另一个服务器上区运行，但是引入了很多问题
2.Call的id映射
3.序列化和反序列化
4.网络传输


*/
